#include "EstrategiaRecursoEscrituraDirecta.h"
#include "Archivo.h"
#include "Buffer.h"

EstrategiaRecursoEscrituraDirecta::EstrategiaRecursoEscrituraDirecta(Archivo* archivo)
 : EstrategiaRecurso(archivo) {

	this->archivo = archivo;
	this->buffer = new Buffer(100000);
}

EstrategiaRecursoEscrituraDirecta::~EstrategiaRecursoEscrituraDirecta() {
	delete this->archivo;
	delete this->buffer;
}

void EstrategiaRecursoEscrituraDirecta::escribir(const Bytes& bytes, offset offset) {

	if (buffer->getDisponible() < bytes.getTamanio()) {
		buffer->liberarEspacio(bytes.getTamanio());
	}
	this->buffer->escribir(bytes,offset);
	this->archivo->escribir(bytes,offset);
}

bool EstrategiaRecursoEscrituraDirecta::setTamanioArchivo(cantBytes nuevo) {

	EstrategiaRecurso::setTamanioArchivo(nuevo);
	this->buffer->eliminarOffsetSuperiores(nuevo);

	return true;
}

Bytes EstrategiaRecursoEscrituraDirecta::leer(offset offset, cantBytes cantBytes) {

	Bytes resultado = buffer->leer(offset,cantBytes);
	if (resultado.estaVacio()) {
		resultado = this->archivo->leer(offset,cantBytes);
	}

	return resultado;
}

void EstrategiaRecursoEscrituraDirecta::imprimirBuffer() {
	this->buffer->imprimirContenido();
}
